"""
类的继承 (Inheritance)
====================

1. 什么是继承？
----------------
继承就是一个类，继承另外一个类的成员变量和成员方法

语法：
class 子类名(父类名):
    # 子类的定义

子类构建的类对象，可以：
- 有自己的成员变量和成员方法
- 使用父类的成员变量和成员方法

继承的作用：
1. 代码重用：避免重复编写相同的代码
2. 扩展功能：在现有类的基础上增加新功能
3. 建立类之间的层次关系
4. 实现多态性

继承的基本概念：
- 父类（基类）：被继承的类
- 子类（派生类）：继承其他类的类
"""

# 示例1: 基本继承概念
class Animal:
    """动物基类"""
    def __init__(self, name, age):
        self.name = name
        self.age = age
    
    def eat(self):
        """吃饭方法"""
        print(f"{self.name} 正在吃饭")
    
    def sleep(self):
        """睡觉方法"""
        print(f"{self.name} 正在睡觉")

class Dog(Animal):
    """狗类，继承自动物类"""
    def bark(self):
        """狗叫方法"""
        print(f"{self.name} 汪汪叫")

class Cat(Animal):
    """猫类，继承自动物类"""
    def meow(self):
        """猫叫方法"""
        print(f"{self.name} 喵喵叫")

# 使用示例
# dog = Dog("旺财", 3)
# dog.eat()    # 继承自父类的方法
# dog.sleep()  # 继承自父类的方法
# dog.bark()   # 子类自己的方法
# 
# cat = Cat("咪咪", 2)
# cat.eat()    # 继承自父类的方法
# cat.sleep()  # 继承自父类的方法
# cat.meow()   # 子类自己的方法

"""
2. 单继承和多继承
------------------
单继承：一个类继承另一个类
多继承：一个类继承多个类，按照顺序从左向右依次继承
多继承中，如果父类有同名方法或属性，先继承的优先级高于后继承
"""

# 单继承示例
class Bird(Animal):
    """鸟类，继承自动物类（单继承）"""
    def __init__(self, name, age, feather_color):
        # 调用父类的构造方法
        super().__init__(name, age)
        self.feather_color = feather_color
    
    def eat(self):
        """重写父类的eat方法"""
        print(f"{self.name} 正在吃虫子")
    
    def fly(self):
        """鸟类特有的飞行方法"""
        print(f"{self.name} 正在飞翔")

# 多继承示例
class Flyable:
    """可飞行的类"""
    def fly(self):
        print("正在飞行")

class Swimmable:
    """可游泳的类"""
    def swim(self):
        print("正在游泳")

class Duck(Animal, Flyable, Swimmable):
    """
    鸭子类，继承自动物类、可飞行类和可游泳类（多继承）
    按照顺序从左向右依次继承：Animal > Flyable > Swimmable
    """
    def __init__(self, name, age):
        super().__init__(name, age)

# 使用示例
# duck = Duck("唐老鸭", 5)
# duck.eat()   # 来自Animal类
# duck.fly()   # 来自Flyable类（按继承顺序优先）
# duck.swim()  # 来自Swimmable类

"""
3. pass关键字的作用是什么？
----------------------------
pass是占位语句，用来保证函数（方法）或类定义的完整性，
表示无内容，空的意思。在定义类或函数时，如果没有具体实现，
可以使用pass占位，避免语法错误。
"""

# 使用pass关键字的示例
class PlaceholderClass:
    """占位类示例"""
    pass  # 暂时没有具体的实现

class FutureImplementation:
    """未来实现的类"""
    def method_to_implement(self):
        pass  # 方法预留，暂未实现具体功能
    
    def another_method(self):
        pass  # 另一个预留方法

# 示例4: 使用super()调用父类方法
class Vehicle:
    """交通工具基类"""
    def __init__(self, brand):
        self.brand = brand
    
    def start(self):
        print(f"{self.brand} 交通工具启动了")

class Car(Vehicle):
    """汽车类，继承自交通工具类"""
    def __init__(self, brand, model):
        # 使用super()调用父类构造方法
        super().__init__(brand)
        self.model = model
    
    def start(self):
        # 调用父类的方法
        super().start()
        print(f"{self.brand} {self.model} 汽车启动了")

# 使用示例
# car = Car("丰田", "卡罗拉")
# car.start()

# 继承的相关函数和方法：
"""
isinstance(obj, class) - 检查对象是否是类的实例或其子类的实例
issubclass(subclass, class) - 检查类是否是另一个类的子类
"""

# 示例：检查继承关系
# print(isinstance(dog, Dog))      # True
# print(isinstance(dog, Animal))   # True
# print(issubclass(Dog, Animal))   # True
# print(issubclass(Cat, Dog))      # False

# 继承的注意事项：
"""
1. 子类会继承父类的所有公有属性和方法
2. 私有属性和方法（以双下划线开头）不会被直接继承
3. 可以通过方法重写来改变父类方法的行为
4. 使用super()可以调用父类的方法

"""
